# 导入所需的库
import os  # 用于文件和目录操作
import smtplib  # 用于发送邮件
from email.mime.multipart import MIMEMultipart  # 用于创建多部分邮件
from email.mime.text import MIMEText  # 用于创建文本内容
from email.mime.application import MIMEApplication  # 用于添加附件
from datetime import datetime  # 用于生成时间戳



def send_analysis_email(sender_email, sender_password, recipients, cc_recipients, input_file):
    """
    发送带有分析结果附件的邮件
    
    参数:
        sender_email (str): 发件人邮箱
        sender_password (str): 发件人密码
        recipients (list): 收件人邮箱列表
        cc_recipients (list): 抄送人邮箱列表
        input_file (str): 要发送的文件路径
    """
    print("\n[调试] 开始准备发送邮件")
    print(f"[调试] 发件人: {sender_email}")
    print(f"[调试] 收件人: {recipients}")
    print(f"[调试] 抄送人: {cc_recipients}")
    print(f"[调试] 附件文件: {input_file}")
    print(f"[调试] 附件文件(编码): {repr(input_file)}")
    
    # 检查文件是否存在，如果不存在则尝试在项目根目录下查找
    if not os.path.exists(input_file):
        print(f"[调试] 文件 {input_file} 不存在，尝试在项目根目录下查找")
        # 获取项目根目录
        backend_path = os.path.dirname(os.path.abspath(__file__))
        project_root = os.path.dirname(os.path.dirname(backend_path))
        
        # 如果input_file包含路径分隔符，只取文件名部分
        if os.sep in input_file:
            filename = os.path.basename(input_file)
        else:
            filename = input_file
            
        # 构建完整的文件路径
        full_path = os.path.join(project_root, filename)
        print(f"[调试] 尝试完整路径: {full_path}")
        
        if os.path.exists(full_path):
            print(f"[调试] 找到文件: {full_path}")
            input_file = full_path
        else:
            # 列出项目根目录下的所有xlsx文件
            print("[调试] 项目根目录下的xlsx文件:")
            for file in os.listdir(project_root):
                if file.endswith('.xlsx'):
                    print(f"  {file}")
            raise FileNotFoundError(f"文件不存在: {input_file}")
    
    print(f"[调试] 附件大小: {os.path.getsize(input_file) / 1024:.2f} KB")
    
    # 创建邮件对象
    msg = MIMEMultipart()
    # 设置邮件头部信息
    msg['From'] = sender_email
    msg['To'] = ', '.join(recipients)  # 将收件人列表转换为逗号分隔的字符串
    msg['Cc'] = ', '.join(cc_recipients)  # 将抄送人列表转换为逗号分隔的字符串
    # 改进邮件主题：使用文件名而非变量名，并添加更明确的描述
    msg['Subject'] = f"{os.path.basename(input_file)} - {datetime.now().strftime('%Y-%m-%d %H:%M')}"
    
    # 设置邮件正文
    body = """
    好：

       详见附件。


--------------------------------
sxlibo@sn.chinamobile.com 
陕西移动网管中心云平台维护室 李波
13571822791

    """
    # 将正文添加到邮件中，使用UTF-8编码
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
    # 添加文件作为附件
    print("[调试] 正在添加附件...")
    # 以二进制只读模式打开输入文件，确保正确处理各种文件类型
    with open(input_file, 'rb') as f:
        # 创建MIMEApplication对象，用于处理二进制附件
        # f.read()读取文件的全部内容作为附件数据
        attachment = MIMEApplication(f.read())
        
        # 设置附件的Content-Disposition头信息
        # 'attachment'表示这是一个附件而非内联内容
        # filename参数指定下载时显示的文件名，使用os.path.basename获取文件名部分
        attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(input_file))
        
        # 将附件添加到邮件消息中
        msg.attach(attachment)
    print("[调试] 附件添加完成")
    
    try:
        print("[调试] 正在连接SMTP服务器...")
        # 连接到OA的SMTP服务器，使用SSL连接
        server = smtplib.SMTP_SSL('smtp.sn.chinamobile.com', 465)
        print("[调试] SMTP服务器连接成功")
        
        print("[调试] 正在登录邮箱...")
        # 登录邮箱
        server.login(sender_email, sender_password)
        print("[调试] 邮箱登录成功")
        
        # 合并收件人和抄送人列表
        all_recipients = recipients + cc_recipients
        print(f"[调试] 准备发送邮件给 {len(all_recipients)} 个收件人")
        
        # 发送邮件
        print("[调试] 正在发送邮件...")
        server.sendmail(sender_email, all_recipients, msg.as_string())
        # 关闭连接
        server.quit()
        print("邮件发送成功！")
        
        
    except smtplib.SMTPAuthenticationError as e:
        print(f"[错误] SMTP认证失败: {str(e)}")
        raise
    except smtplib.SMTPException as e:
        print(f"[错误] SMTP错误: {str(e)}")
        raise
    except Exception as e:
        print(f"[错误] 发送邮件时出错: {str(e)}")
        raise